﻿#ifndef CLogWidget_H
#define CLogWidget_H
/********************************************************************************
** @ Date:2025/10/14
** @ Author: HanJiaXin
** @ Description:日志控件
** @ Version:1.0.0
** @ ClassName:CLogWidget
** @ Fun:
********************************************************************************/
#include <QWidget>
#include <QStandardItemModel>
#include <QSharedPointer>
#include <QMenu>
#include "ui_CLogWidget.h"

struct LogData;

class CLogWidget : public QWidget
{
	Q_OBJECT

public:
	CLogWidget(const QString& moduleName, const QVector<QString>& vecDeviceNames,int nType, QWidget *parent = nullptr);
	~CLogWidget();
	
	void setShowLimit(int nShowLimit);
	// 刷新配置
	void refreshConfig();
	void onLogAdded(const QSharedPointer<LogData>& logData);//上层调用了写日志
	void onConfig();//上层配置改变

private:
	void initConnect();                                 //初始化槽函数连接
	void initUI();										//初始化界面
	void initModel();									//初始化表格Model
	void initContextMenu();// 初始化右键菜单
	void addLog(const QSharedPointer<LogData>& logData);//添加日志
	void clearLogs();                                   //清空日志
	void applyConfig();                                 //应用上层的配置
	void refreshRowNumbers();

	void addLogsBatch(const QVector<QSharedPointer<LogData>>& logs);                // 批量添加日志
	void addSingleLog(const QSharedPointer<LogData>& logData);                      // 添加单条日志（不进行数量限制检查）
	QList<QStandardItem*> createLogRowItems(const QSharedPointer<LogData>& logData);// 创建日志行数据
	bool isLogBelongsToWidget(const QSharedPointer<LogData>& logData) const;        // 检查日志是否属于当前控件

	//查询当天符合条件的日志
	QVector<QSharedPointer<LogData>> CLogWidget::queryTodayLogsWithFilter(const QString& keyword,const QString& deviceName,const QString& levelDesc);
	//读取符合条件的日志
	QVector<QSharedPointer<LogData>> CLogWidget::readAndFilterLogFile(const QString& filePath, const QString& moduleName, const QString& deviceName,
		const QString& keyword, int levelFilter) const;

public slots:
	void loadRecentHistoryLogs();	                        //加载最近的历史日志
	void slotPushFilter();                                  //点击筛选
	void slotClearList();                                   //右键菜单 - 清空列表
	void slotShowContextMenu(const QPoint& pos);            //显示右键菜单
	void slotDoubleClick();									//双击表格
	void slotConfig();										//配置
	void slotHis();											//历史日志

private:
	Ui::CLogWidgetClass ui;
	QString m_sModuleName;//本控件显示的模块
	QVector<QString> m_vecDeviceNames;//本控件需要显示的设备
	int m_nType;           //0：m_vecDeviceNames中的设备 1:跳过m_vecDeviceNames的检查，全部都显示
	QStandardItemModel* m_pModel;
	int m_nMaxDisplayCount;//表格展示最大记录数
	
	bool m_bFiltering;     // 筛选状态
	QMenu* m_pContextMenu;  // 右键菜单
};

#endif